#include <gtest/gtest.h>
#include <unistd.h>
#include <fcntl.h>
#include<thread>
#include "eventloop.h"
#include "channel.h"

// 辅助：将 fd 设置为非阻塞
void setNonBlock(int fd) {
    int flags = fcntl(fd, F_GETFL, 0);
    fcntl(fd, F_SETFL, flags | O_NONBLOCK);
}

TEST(EventLoopTest, LoopHandlesReadableEventAndQuits) {
    EventLoop loop;

    int fds[2];
    ASSERT_EQ(pipe(fds), 0);  // fds[0] 读端，fds[1] 写端
    setNonBlock(fds[0]);

    Channel channel(&loop, fds[0]);
    channel.setReadCallback([&]() {
        char buf[16];
        ssize_t n = read(fds[0], buf, sizeof(buf));
        (void)n;  // 忽略返回值
        loop.quit();  // 触发 quit()，使 loop 退出
    });

    channel.enableReading();  // 注册到 poller

    // 在子线程中执行 loop
    std::thread t([&]() {
        loop.loop();  // 启动事件循环
    });

    // 睡一下再写，确保 loop 已进入 poll 等待
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    const char* msg = "hello";
    write(fds[1], msg, strlen(msg));  // 写入数据使得 fd 可读

    t.join();

    close(fds[0]);
    close(fds[1]);
}
